package com.pethospital.service;

import com.pethospital.entity.PageResult;
import com.pethospital.entity.Pet;

import java.util.List;

/**
 * 宠物服务接口
 * Pet Service Interface
 * 
 * @author PetHospital System
 * @version 1.0
 */
public interface PetService {
    
    /**
     * 根据宠物ID查询宠物
     * 
     * @param petId 宠物ID
     * @return Pet 宠物对象
     */
    Pet getPetById(Integer petId);
    
    /**
     * 根据主人ID查询宠物列表
     *
     * @param ownerId 主人ID
     * @return List<Pet> 宠物列表
     */
    List<Pet> getPetsByOwnerId(Integer ownerId);

    /**
     * 根据主人ID查询最近添加的宠物
     *
     * @param ownerId 主人ID
     * @param limit 限制数量
     * @return List<Pet> 最近添加的宠物列表
     */
    List<Pet> getRecentPetsByOwnerId(Integer ownerId, int limit);
    
    /**
     * 添加宠物
     * 
     * @param pet 宠物对象
     * @return boolean 添加是否成功
     */
    boolean addPet(Pet pet);
    
    /**
     * 更新宠物信息
     * 
     * @param pet 宠物对象
     * @return boolean 更新是否成功
     */
    boolean updatePet(Pet pet);
    
    /**
     * 删除宠物
     * 
     * @param petId 宠物ID
     * @return boolean 删除是否成功
     */
    boolean deletePet(Integer petId);
    
    /**
     * 批量删除宠物
     * 
     * @param petIds 宠物ID数组
     * @return boolean 删除是否成功
     */
    boolean batchDeletePets(Integer[] petIds);
    
    /**
     * 查询所有宠物
     * 
     * @return List<Pet> 宠物列表
     */
    List<Pet> getAllPets();
    
    /**
     * 分页查询宠物
     * 
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Pet> 分页结果
     */
    PageResult<Pet> getPetsByPage(int currentPage, int pageSize);
    
    /**
     * 根据主人ID分页查询宠物
     * 
     * @param ownerId 主人ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Pet> 分页结果
     */
    PageResult<Pet> getPetsByOwnerAndPage(Integer ownerId, int currentPage, int pageSize);
    
    /**
     * 根据条件搜索宠物
     * 
     * @param petName 宠物姓名（模糊查询）
     * @param petType 宠物类型
     * @param breed 品种
     * @param status 健康状态
     * @param ownerId 主人ID（可选，为null时查询所有）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Pet> 分页结果
     */
    PageResult<Pet> searchPets(String petName, String petType, String breed,
                             String status, Integer ownerId, int currentPage, int pageSize);

    /**
     * 根据条件分页查询宠物（带排序）
     *
     * @param petName 宠物名称（模糊查询）
     * @param petType 宠物类型
     * @param breed 品种
     * @param status 健康状态
     * @param ownerId 主人ID（为null时查询所有）
     * @param sortField 排序字段
     * @param sortOrder 排序方向（asc/desc）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Pet> 分页结果
     */
    PageResult<Pet> searchPetsWithSort(String petName, String petType, String breed,
                                     String status, Integer ownerId, String sortField,
                                     String sortOrder, int currentPage, int pageSize);

    /**
     * 统计宠物总数
     *
     * @return long 宠物总数
     */
    long getTotalPetCount();
    
    /**
     * 根据主人ID统计宠物数量
     * 
     * @param ownerId 主人ID
     * @return long 宠物数量
     */
    long getPetCountByOwner(Integer ownerId);
    
    /**
     * 根据宠物类型统计数量
     * 
     * @param petType 宠物类型
     * @return long 宠物数量
     */
    long getPetCountByType(String petType);
    
    /**
     * 根据健康状态统计数量
     *
     * @param status 健康状态
     * @return long 宠物数量
     */
    long getPetCountByStatus(String status);

    /**
     * 统计今日注册宠物数量
     *
     * @return long 今日注册宠物数量
     */
    long getTodayRegisteredPetCount();

    /**
     * 根据主人ID统计今日注册宠物数量
     *
     * @param ownerId 主人ID
     * @return long 今日注册宠物数量
     */
    long getTodayRegisteredPetCountByOwnerId(Integer ownerId);
    
    /**
     * 更新宠物状态
     * 
     * @param petId 宠物ID
     * @param status 健康状态
     * @return boolean 更新是否成功
     */
    boolean updatePetStatus(Integer petId, String status);
    
    /**
     * 更新宠物照片
     * 
     * @param petId 宠物ID
     * @param photoUrl 照片路径
     * @return boolean 更新是否成功
     */
    boolean updatePetPhoto(Integer petId, String photoUrl);
    
    /**
     * 获取宠物类型统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[类型, 数量]
     */
    List<Object[]> getPetTypeStatistics();
    
    /**
     * 获取健康状态统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[状态, 数量]
     */
    List<Object[]> getStatusStatistics();
    
    /**
     * 验证宠物数据
     * 
     * @param pet 宠物对象
     * @param isUpdate 是否为更新操作
     * @return String 验证结果，null表示验证通过，否则返回错误信息
     */
    String validatePet(Pet pet, boolean isUpdate);
    
    /**
     * 检查用户是否有权限操作该宠物
     * 
     * @param petId 宠物ID
     * @param userId 用户ID
     * @param isAdmin 是否为管理员
     * @return boolean 是否有权限
     */
    boolean hasPermission(Integer petId, Integer userId, boolean isAdmin);
    
    /**
     * 获取宠物品种列表（根据类型）
     * 
     * @param petType 宠物类型
     * @return List<String> 品种列表
     */
    List<String> getBreedsByType(String petType);
    
    /**
     * 获取所有宠物类型
     * 
     * @return List<String> 宠物类型列表
     */
    List<String> getAllPetTypes();
    
    /**
     * 根据年龄范围查询宠物
     * 
     * @param minAge 最小年龄（月）
     * @param maxAge 最大年龄（月）
     * @return List<Pet> 宠物列表
     */
    List<Pet> getPetsByAgeRange(Integer minAge, Integer maxAge);
    
    /**
     * 根据体重范围查询宠物
     * 
     * @param minWeight 最小体重
     * @param maxWeight 最大体重
     * @return List<Pet> 宠物列表
     */
    List<Pet> getPetsByWeightRange(Double minWeight, Double maxWeight);
    
    /**
     * 获取需要关注的宠物（生病或治疗中）
     * 
     * @return List<Pet> 需要关注的宠物列表
     */
    List<Pet> getPetsNeedingAttention();
    
    /**
     * 导入宠物数据
     * 
     * @param pets 宠物列表
     * @return int 成功导入的数量
     */
    int importPets(List<Pet> pets);
    
    /**
     * 导出宠物数据
     * 
     * @param ownerId 主人ID（可选，为null时导出所有）
     * @return List<Pet> 宠物列表
     */
    List<Pet> exportPets(Integer ownerId);
}
